import cv2

# 定义图像路径和读取模式
# image_path = '../Fig0307(a)(intensity_ramp).tif'  # 图像文件路径
# image_path = '../Fig0335(a)(ckt_board_saltpep_prob_pt05).tif'  # 图像文件路径
image_path = '../Fig0316(3)(third_from_top).tif'  # 图像文件路径

read_mode = cv2.IMREAD_GRAYSCALE  # 读取模式，读取为灰度图像

# 读取图像，转换为灰度图像
image = cv2.imread(image_path, read_mode)

# 检查图像是否成功加载
if image is None:
    print(f"Error: Unable to load image from {image_path}")
    exit()

# 定义简单阈值法的参数
simple_threshold_value = 127  # 阈值设置为127
max_value = 255  # 阈值化时大于阈值的像素值设置为255
threshold_type = cv2.THRESH_BINARY  # 阈值类型为二值化

# 应用简单阈值法
_, thresh_simple = cv2.threshold(image, simple_threshold_value, max_value, threshold_type)

# 定义自适应阈值法的参数
adaptive_max_value = 255                        # 自适应阈值法的最大值
adaptive_method = cv2.ADAPTIVE_THRESH_MEAN_C    # 使用局部区域均值来计算阈值
adaptive_threshold_type = cv2.THRESH_BINARY     # 阈值类型为二值化
block_size = 11                                 # 块大小，用于局部区域
constant = 2                                    # 常数，从局部均值中减去，调整局部区域均值的结果常。

# 应用自适应阈值法
thresh_adaptive = cv2.adaptiveThreshold(image, adaptive_max_value, adaptive_method, 
                                       adaptive_threshold_type, block_size, constant)

# 定义OTSU阈值法的参数
otsu_threshold_value = 0  # OTSU方法自动选择阈值
otsu_threshold_type = cv2.THRESH_BINARY + cv2.THRESH_OTSU  # OTSU方法与二值化结合使用

# 应用OTSU阈值法
_, thresh_otsu = cv2.threshold(image, otsu_threshold_value, max_value, otsu_threshold_type)

# 显示处理结果
cv2.imshow('Original Image', image)  # 显示原图
cv2.imshow('Simple Thresholding', thresh_simple)  # 显示简单阈值化结果
cv2.imshow('Adaptive Thresholding', thresh_adaptive)  # 显示自适应阈值化结果
cv2.imshow('OTSU Thresholding', thresh_otsu)  # 显示OTSU阈值化结果

# 等待按键事件，按任意键关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()  # 关闭所有显示的窗口
